/*
## 闭包作用之保存
> 函数执行，形成一个私有作用域，函数执行完成，形成的这个栈内存一般情况下都会自动释放。
>
>但是还有二般情况，函数执行完成，当前私有作用域中的某一部分内容被栈内存以外的其它东西（变量/元素的事件）占用了。当前的栈内存就不能释放掉，也就形成了不销毁的私有作用域（里面的私有变量也不会销毁）。
*/

//case:1 不会销毁 内部内容被栈内存以外的东西占用

//通过挂在载windows上
/*(function(window,undefined){
    var jQuery = function(){

    };

    window.jQuery = window.$ = jquery;
})(window);*/


//通过return赋值给变量
/*
var Zepto = (function(){
    var Zepto = function(){

    };

    return Zepto;
})();
Zepto();
*/


/*
函数执行形成一个私有作用域，如果私有作用域中的的部分内容被外部的变量占用了，私有作用域不会销毁。

[形式]
函数执行返回了一个引用数据类型堆内存的地址（并且这个堆内存是隶属于这个作用域的，即是在当前执行栈中开辟的），在外面有一个变量接收了这个返回值，此时当前作用域就不能销毁（想要销毁，只需要让外面的变量赋值为null，也就是不占用当前作用域中的内容了）
*/

//case:2

/*function fn(){
    var i = 1;
    return function(n){
        console.log(n + i++);
    }
}

var f = fn();
//旧的↓
f(10);//11
//新的↓
fn()(10);//11
//旧的↓
f(20);//22
//新的↓
fn()(20);//21*/




//case 3
/*var i = 1;

function fn(){
    return function(n){
        console.log(n + i++);
    }
}

var f = fn();
//旧的↓
f(10);//11
//新的↓
fn()(10);//12
//旧的↓
f(20);//23
//新的↓
fn()(20);//24*/


//case 4

function fn(i){
    return function(n){
        console.log(n + (++i));
    }
}

var f = fn(10);
//旧的↓
f(20);//31
//新的↓
fn(10)(20);//31
//旧的↓
f(30);//42
//新的↓
fn(20)(10);//31
f(40);//53


/**/